# -*- coding: utf-8 -*-
# Python中默认的编码格式是 ASCII 格式，在没修改编码格式时无法正确打印汉字，所以在读取中文时会报错。

# https://zhuanlan.zhihu.com/p/196473543

# 一个实现了 描述符协议 的类就是一个描述符。

# 什么描述符协议：在类里实现了 __get__()、__set__()、__delete__() 其中至少一个方法。

# 在这里我要告诉你：从根本上讲，描述符就是可以重复使用的属性。也就是说，描述符可以让你编写这样的代码：


class Score:

    def __init__(self, default=0):
        self._score = default

    def __set__(self, instance, value):                                     # 使用_set_方法可以限制传入的类型
        if not isinstance(value, int):
            raise TypeError('Score must be integer')
        if not 0 <= value <= 100:
            raise ValueError('Valid value must be in [0, 100]')

        self._score = value

    def __get__(self, instance, owner):
        return self._score

    def __delete__(self):
        del self._score

class Student:
    math = Score(0)
    chinese = Score(0)
    english = Score(0)

    def __init__(self, name, math, chinese, english):
        self.name = name
        self.math = math
        self.chinese = chinese
        self.english = english


    def __repr__(self):
        return "<Student: {}, math:{}, chinese: {}, english:{}>".format(
                self.name, self.math, self.chinese, self.english
            )


s1 = Student("xiaoming",1,2,10)
print(s1)